NO.39 组合总数 中等
思路一:深度遍历,回溯法 深度遍历得到”全排列“的过程中回溯剪枝。目标值作为根节点,每个分做减法,如果目标值被减为0则结算此分支路径上的减数集合,如果目标值被减为负数则剪枝即可。
去重:每个分支节点上的减数的下标不能比本分支上一层节点的减数的下标小。即,上层节点的减数下标为3,则同分支下一层节点的减数下标要从3开始。(这样每个分支就不会重复使用之前使用过的元素)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| List<List<Integer>> res=new ArrayList<>(); public List<List<Integer>> combinationSum(int[] candidates, int target) { if (candidates==null)return res; dfs(target,0,new Stack<Integer>(),candidates); return res; }
private void dfs(int target, int index, Stack<Integer> pre, int[] candidates) { if (target==0){ res.add(new ArrayList<>(pre)); return; } for (int i=index;i<candidates.length;i++){ if (candidates[i]<=target){ pre.push(candidates[i]); dfs(target-candidates[i],i,pre, candidates); pre.pop(); } } }
|
本人菜鸟,有错误请告知,感激不尽!
更多题解和学习记录博客:博客、github